<?php

/**
 * Модель работы со справочниками
 */
class ReferencesModel extends DbModel {

    protected $_name = 'references';

    /**
     * Получение списка таблиц БД
     *
     * @return array
     */
    public function getTables() {
        $res = $this->_db->fetchAll("SHOW TABLES");
        $tables = array();
        $return = '';
        foreach ($res as $value) {
            $t = each($value);
            $name = $t['value'];
            $table[$name] = $name;
        }
        return $table;
    }

    /**
     * Получение справочников/справочника
     *
     * @param int $id #ID справочника
     * @return mixed
     */
    public function getRefs($id = 0) {
        $select = $this->select();
        if ($id > 0) {
            $select->where('id = ?', $id);
            $row = $this->fetchRow($select);
            $res = $row->toArray();
        } else {
            $res = $this->fetchAll($select);
        }
        return $res;
    }

    /**
     * Получение списка справочников
     *
     * @return array
     */
    public function getRefsList() {
        $select = $this->_db->select()->from(PREFIX . $this->_name, array('id', 'title'));
        $res = $this->_db->fetchPairs($select);
        return $res;
    }

    /**
     * Обновление/добавление справочника
     *
     * @param array $data Данные справочника
     * @param int $id #ID справочника
     * @return int #ID справочника
     */
    public function updateReference($data, $id) {
        if ($id > 0) {
            $this->update($data, "id = " . $id);
            return $id;
        } else {
            $this->insert($data);
            $id = $this->_db->lastInsertId();
            return $id;
        }
    }

    /**
     * Получение записей справочника с "select переопределением"
     *
     * @param array $ref Справочник
     * @param object $fields Поля формы
     * @return mixed Записи
     */
    public function getRecords($ref, $fields = null, $sid = 0) {
        $fields_array = array('id');
        $select_array = '';
        $select = $this->_db->select();
        try {
            if (!is_null($fields)) {
                while (list($key, $val) = each($fields)) {
                    if ($val->type === 'select') {
                        $select->joinLeft(array($val->table => $val->table), $ref['table'] . '.' . $val->field . ' = ' . $val->table . '.id', array($val->table_field . ' AS ' . $val->field));
                    } else {
                        $fields_array[] = $val->field;
                    }
                }
            }
            if ($ref['connection'])
                $fields_array[] = 'sid';
            $select = $select->from($ref['table'], $fields_array);

            if (trim($ref['order']) <> '')
                $select->order($ref['table'] . '.' . $ref['order']);
            if (trim($ref['where']) <> '')
                $select->where($ref['table'] . '.' . $ref['where']);
            if ($sid > 0)
                $select->where('sid = ' . $sid);
            $res = $this->_db->fetchAll($select);
            return $res;
        } catch (Exception $exc) {
            return null;
        }
        
    }

    /**
     * Постраничное возвращение справочника
     *
     * @param int $pageNumber Номер страницы
     * @param array $ref Справочник
     * @param object $fields Поля формы
     * @param $sid #ID Секции
     * @param $id #ID Записи
     * @param $tid #ID Тэга
     * @return mixed
     */
    public function getPaginatorRows($ref, $fields = null, $pageNumber = 1, $sid = 0, $id = 0, $tid = 0) {
        $fields_array = array('id');
        $select = $this->_db->select();
        if (!is_null($fields)) {
            while (list($key, $val) = each($fields)) {
                if ($val->type === 'select') {
                    $select->joinLeft(array($val->table => $val->table), $ref['table'] . '.' . $val->field . ' = ' . $val->table . '.id', array($val->table_field . ' AS ' . $val->field));
                } elseif ($val->type === 'tags' && $tid > 0) {
                    $select->join(array('tag_links' => PREFIX . 'tags_links'), 'tag_links.oid = ' . $ref['table'] . '.id', array())
                            ->where('tag_links.tid = ' . $tid)
                            ->group($ref['table'] . '.id');
                } else {
                    $fields_array[] = $val->field;
                }
            }
        }

        if ($ref['connection'])
            $fields_array[] = 'sid';
        $select = $select->from($ref['table'], $fields_array);
        if (trim($ref['order']) <> '')
            $select->order($ref['table'] . '.' . $ref['order']);
        if (trim($ref['where']) <> '')
            $select->where($ref['table'] . '.' . $ref['where']);
        if ($sid > 0)
            $select->where($ref['table'] . '.sid = ' . $sid);
        if ($id > 0)
            $select->where($ref['table'] . '.id = ' . $id);

        $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_DbSelect($select));
        $paginator->setCurrentPageNumber($pageNumber);
        $model = new PaginatorModel();
        return $model->get($paginator, $ref['count']);
    }

    /**
     * Получение записи
     *
     * @param array $ref Справочник
     * @param int $id #ID Справочника
     * @return array Запись
     */
    public function getRecord($ref, $id = 0) {
        if ($id > 0) {
            $select = $this->_db->select()->from($ref['table'])->where("id = " . $id);
            $res = $this->_db->fetchRow($select);
            return (array) $res;
        } else {
            return array();
        }
    }

    /**
     * Обновление/добавление записи
     *
     * @param string $table Имя таблицы БД
     * @param array $data Данные
     * @param int $id #ID записи
     * @return int #ID
     */
    public function updateRecord($table, $data, $id) {
        if ($id > 0) {
            $this->_db->update($table, $data, "id = " . $id);
            return $id;
        } else {
            $this->_db->insert($table, $data);
            $id = $this->_db->lastInsertId();
            return $id;
        }
    }

    /**
     * Удаление записи
     *
     * @param string $table Имя таблицы БД
     * @param int $id #ID записи
     */
    public function deleteRecord($table, $id = 0) {
        if ($id > 0) {
            $this->_db->delete($table, "id = " . $id);
        }
    }

    /**
     * Удаление справочника
     *
     * @param int $id #ID Справочника
     */
    public function deleteRef($id) {
        if ($id > 0) {
            $this->delete("id = " . $id);
        }
    }

    /**
     * Обновление справочника секции
     *
     * @param array $data Данные
     * @param int $id #ID Секции
     * @return int #ID Секции
     */
    public function updateSectionRef($data, $id = 0) {
        if ($id > 0) {
            $this->_db->update('page_reference', $data, 'sid = ' . $id);
        } else {
            $this->_db->insert('page_reference', $data);
            $id = $this->_db->lastInsertId();
        }
        return $id;
    }

    /**
     * Получение справочника секции
     *
     * @param int $sid #ID Секции
     * @return object Справочник секции
     */
    public function getSectionRef($sid) {
        $sql = $this->_db->select()->from(PREFIX . 'page_reference')->where('sid = ' . $sid);
        return $this->_db->fetchRow($sql);
    }

    /**
     * Удаление секции со справочником
     *
     * @param int $sid #ID Секции
     */
    public function deleteSection($sid) {
        $id = (int) $sid;
        if ($id > 0) {
            $this->delete("sid = " . $id);
        }
    }

}